<?php
/**
 * Created by PhpStorm.
 * User: aron
 * Date: 2019/5/8
 * Time: 4:29 PM
 */

define("DEBUG_MODE_SHOW_ERROR", TRUE);
include_once "../../Util/DebugUtil/DebugUtil.php";

/**
 * Trait TestParentTrait
 * 父trait会被其他子trait引用
 */
trait TestParentTrait {
    function tpt_say() {
        echo "TestParentTrait say";
        yt_debug_print_break_line();
    }
}

trait TestTrait
{
    public $pro1 = true;
    public $pro2 = 1;

    /**
     * trait TestTrait trait TestTrait2 共同拥有的方法，
     * 需要在引用的地方置顶使用某个trait的方法，否则会报错
     */
    function commonethod()
    {
        echo "TestTrait commonethod called";
        yt_debug_print_break_line();
    }

    function tt_say() {
        echo "TestTrait ts_say called";
        yt_debug_print_break_line();
    }

    abstract public function commonAbsMethod();
}

trait TestTrait2
{
    // trait 中可以使用另一个trait
    use TestParentTrait;

    public $pro1 = true;
    public $pro2 = 1;

    /**
     * trait TestTrait trait TestTrait2 共同拥有的方法，
     * 需要在引用的地方置顶使用某个trait的方法，否则会报错
     */
    function commonethod()
    {
        echo "TestTrait2 commonethod called";
        yt_debug_print_break_line();
    }

    abstract public function commonAbsMethod();
}


class TestUseTraitClass
{
    // 使用的trait中存在同名的方法如果不置顶使用的方法在运行时会报错
    // Fatal error: Trait method commonethod has not been applied,
    // because there are collisions with other trait methods on TestUseTraitClass in
    // /Users/aron/GitRepos/PhpLearning/BroPhpDemoCode/11/11.9/trait.php on line 38
    use TestTrait , TestTrait2 {
        // 置顶使用TestTrait2的commonethod方法
        TestTrait2::commonethod insteadof TestTrait;
    }

    /**
     * 需要重写trait中的抽象方法
     */
    public function commonAbsMethod()
    {
        echo "commonAbsMethod called";
        yt_debug_print_break_line();
    }

}


$obj = new TestUseTraitClass();
$obj->tt_say();
$obj->commonAbsMethod();
$obj->tpt_say();
// Output:
//TestTrait ts_say called
//commonAbsMethod called
//TestParentTrait say

